/* 
 * Autores:
 *      Jonathan Lopez  11106
 *      Jorge Martínez  11237
 * 
 * Archivo: Evento.java
 * Última Revision: $Rev: 62 $
 *      Fecha: $Date: 2011-09-17 21:53:39 +0000 (Sat, 17 Sep 2011) $
 */ 

package Manejo.Transporte;

import Manejo.Transporte.Registros.*;
import Archivador.iArchivable;
import java.util.Date;

/**
 * Registra el paso de un Contenedor por algun Puerto
 * 
 * @author Jonathan López
 * @author Jorge Martinez
 */
public class Evento implements iArchivable
{
    private final ID idPuerto;
    private final Date fecha;
    private final Registros registros;

    /**
     * Contructor para Evento
     * @param idPuerto ID del Puerto en donde se registra el Evento, es decir
     * el atraco de un Barco.
     * @param fecha la estampa de tiempo para el momento del atraco.
     */
    public Evento(ID idPuerto, Date fecha, Registros registros)
    {
        this.idPuerto = idPuerto;
        this.fecha = fecha;
        this.registros = registros;
    }
    
    /**
     * Regresa el ID del Puerto al que se refiere este Evento.
     * @return ID del Puerto del Evento
     */
    public ID obtenerPuerto()
    {
        return idPuerto;
    }

    /**
     * Regresa la fecha en que se registró la llegada al Puerto.
     * @return fecha del Evento
     */
    public Date obtenerFecha()
    {
        return (Date)fecha.clone();
    }

    /**
     * Regresa una representación String del Evento que incluye el ID del 
     * Puerto y la fecha de llegada al mismo.
     * @return representación String
     */
    @Override
    public String toString()
    {
        RegPuertos registroPuertos = registros.obtenerRegistroPuertos();
        return "Evento{" + "puerto=" + registroPuertos.obtenerNombre(idPuerto) +
                ", fecha=" + fecha + '}';
    }
    
    /**
     * Regresa un línea de texto para ser guardada en un medio persistente.
     * @return String
     * @see iArchivable#guardar() 
     */
    @Override
    public String guardar()
    {
        // Orden: puerto, fecha
        return idPuerto.guardar() + "|" + fecha.getTime();
    }
    
    /**
     * Genera un nuevo Evento a partir de una línea de texto creada a través
     * del método guardar()
     * @param linea
     * @return nuevo Evento generado a partir del String, o null si falla
     */
    public static Evento parseEvento( String linea, Registros registros ){
        // Validar
        if( linea.length() == 0 )
            return null;
        
        if( !linea.contains( "|" ) )
            return null;
        
        String[] partes = linea.split( "\\|" );
        if( partes.length != 3 )
            return null;
        
        ID _idPuerto = ID.parseID( partes[0] + "|" + partes[1] );
        Date _fecha = new Date( Long.parseLong(partes[2] ));
        
        return new Evento( _idPuerto, _fecha, registros );
    }
    
    /**
     * Punto de entrada para las pruebas unitarias de Evento.
     * @param args
     */
    public static void main( String[] args ){
        int pruebas = 10;
        int fallos = 0;
        java.util.Random generador = new java.util.Random();
        Registros registros = new Registros();
        
        for (int n = 0; n != pruebas; n++) {
            Evento evento = new Evento( GeneradorID.nuevoID(), new Date(),
                    registros);
            String linea = evento.guardar();
            Evento nuevoEvento = Evento.parseEvento(linea, registros);
            
            boolean iguales = evento.toString().equals(nuevoEvento.toString());
            if( !iguales )
                ++fallos;
            
            System.out.println(linea + " & " + iguales);
            System.out.println("\t" + evento );
            System.out.println("\t" + nuevoEvento );
        }
        
        System.out.println("FALLOS: " + fallos );
    }
}
